package com.augurit.common.sysfile.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springside.modules.orm.Page;
import org.springside.modules.orm.PropertyFilter;

import com.augurit.common.dao.SysFileDao;
import com.augurit.common.dao.SysFileLinkDao;
import com.augurit.common.entity.SysFile;
import com.augurit.common.entity.SysFileLink;
import com.augurit.common.sysfile.convert.SysFileConverter;
import com.augurit.common.sysfile.service.ISysFileService;
import com.augurit.common.sysfile.web.form.SysFileForm;
import com.augurit.common.util.PageUtils;
import com.augurit.common.util.lang.CollectionUtils;
import com.augurit.common.util.lang.StringUtils;
import com.augurit.wf.common.web.WfAttachmentMgmtAction;

/**
 * 系统词组逻辑实现类
 */
@Service
@Transactional
public class SysFileServiceImpl implements ISysFileService {
	
	// DAO 引用
	@Autowired
	private SysFileDao sysFileDao; //附件表DAO类

	// DAO 引用
	@Autowired
	private SysFileLinkDao sysFileLinkDao;
	
	
	/**
	 * 根据ID获取子项Form对象
	 * @param id 子项主键ID
	 * @return 子项Form对象
	 */
	@Transactional(readOnly = true)
	public SysFileForm get(Long id){
		return sysFileDao.getForm(id);
	}
	
	/**
	 * 按值对象名称分组查询
	 * @return
	 */
	public List<SysFileLink> getGroupByEntity(){
		return sysFileLinkDao.getGroupByEntity();
	}
	
	/**
	 * 获取所有的值对象名称
	 */
	@Transactional(readOnly = true)
	public List<String> getAllEntityList(){
		return sysFileLinkDao.getAllEntity();
	}
	
	public List<SysFileForm> getAll(){
		List<SysFile> list = sysFileDao.getAll();
		return SysFileConverter.convertToFormList(list);
	}
	
	/**
	 * 获取指定值对象的
	 * @param entity
	 * @return
	 */
	@Transactional(readOnly = true)
	public List<Long> getEntityIdListByEntity(String entity){
		return sysFileLinkDao.getEntityId(entity);
	}
	
	/**
	 * 获取指定值对象名称和值对象主键下的附件对象列表
	 * @param entity 值对象
	 * @param entityId 值主键
	 * @return
	 */
	@Transactional(readOnly = true)
	public List<SysFileForm> getByEntityAndEntityId(String entity, Long entityId){
		if(entity != null && entity.trim().length() > 0 && entityId != null){
			
			Long[] sysFileIds = sysFileLinkDao.getSysFileIds(entity, entityId);
			
			if(sysFileIds != null && sysFileIds.length > 0){
				List<SysFileForm> list = new ArrayList();
				
				for(Long sysFileId : sysFileIds){
					SysFile sysfile = sysFileDao.get(sysFileId); 
					list.add(SysFileConverter.convertToForm(sysfile));
				}
				
				return list;
			}
		}
		return null;
	}
	
	/**
	 * 根据分页对象和过滤条件列表进行分页条件查询
	 * @param page 分页对象
	 * @param filters 过滤条件列表
	 * @return 分页查询结果.附带结果列表及所有查询时的参数
	 */
	@Transactional(readOnly = true)
	public Page<SysFileForm> search(Page<SysFileForm> page, List<PropertyFilter> filters){
		
		// 建立新的分页对象
		Page<SysFile> pg = PageUtils.newPageInstance(page);
		
		// 按过滤条件分页查找对象
		pg = sysFileDao.findPage(pg, filters);
		
		// 转换为Form对象列表并赋值到原分页对象中
		List<SysFileForm> list = SysFileConverter.convertToFormList(pg.getResult());
		PageUtils.copy(pg, list, page);
		return page;
	}
	
	/**
	 * 根据分页对象和Form对象进行分页条件查询
	 * @param page 分页对象
	 * @param form Form对象
	 * @return 分页查询结果.附带结果列表及所有查询时的参数
	 */
	@Transactional(readOnly = true)
	public Page<SysFileForm> search(Page<SysFileForm> page, SysFileForm form) {
		
		// 建立新的分页对象
		Page pg = PageUtils.newPageInstance(page);
		
		// 查询语句及参数
		StringBuffer hql = new StringBuffer("select file, link.entity, link.entityId from SysFileLink link, SysFile file where link.sysFileId = file.id ");
		List<Object> values = new ArrayList();
		
		if(form != null){
			if(StringUtils.isNotBlank(form.getFileCode())){
				hql.append(" and file.fileCode like ?");
				values.add("%" + form.getFileCode() + "%");
			}
			if(StringUtils.isNotBlank(form.getFileName())){
				hql.append(" and file.fileName like ?");
				values.add("%" + form.getFileName() + "%");
			}	
			if(StringUtils.isNotBlank(form.getFileFormat())){
				hql.append(" and file.fileFormat = ?");
				values.add(form.getFileFormat());
			}
			if(StringUtils.isNotBlank(form.getEntity())){
				hql.append(" and link.entity like ?");
				values.add("%" + form.getEntity() + "%");
			}
			if(form.getEntityId() != null){
				hql.append(" and link.entityId = ?");
				values.add(form.getEntityId());
			}
		}
		
		//排序
		if(StringUtils.isNotBlank(page.getOrderBy()))
			hql.append(SysFileConverter.constructOrderBy(page.getOrderBy(), page.getOrder()));
		
		// 执行分页查询操作
		pg = sysFileDao.findPage(pg, hql.toString(), CollectionUtils.toObjectArray(values));
		
		// 转换为Form对象列表并赋值到原分页对象中
		List<SysFileForm> list = SysFileConverter.pageResultConvertToFormList(pg);
		PageUtils.copy(pg, list, page);
		return page;
	}
	

	
	/**
	 * 保存业务字典项Form对象
	 * @param form Form对象
	 */
	public void save(SysFileForm form){
		if(form != null)
			sysFileDao.saveForm(form, null);
	}
	
	/**
	 * 保存业务字典项Form对象
	 * @param form Form对象
	 */
	public void save(SysFileForm form, String userName){
		if(form != null)
			sysFileDao.saveForm(form, userName);
	}
	
	/**
	 * 保存业务字典项Form对象数组
	 * @param forms Form对象数组
	 */
	public void save(SysFileForm[] forms){
		if(forms != null && forms.length > 0){
			for(SysFileForm form : forms)
				sysFileDao.saveForm(form, null);
		}
	}
	
	/**
	 * 根据主键ID删除子项对象
	 * @param id 子项对象主键ID
	 */
	public void delete(Long id) {
		if(id != null)
			sysFileDao.delete(id);
	}
	
	/**
	 * 根据主键ID集合删除多个子项对象
	 * @param ids 子项主键ID集合
	 */
	public void delete(Long[] ids) {
		if(ids != null && ids.length > 0)
			sysFileDao.delete(ids);
	}
	
	/**
	 * 根据值对象名称和值对象主键删除附件
	 * @param entity 值对象名称
	 * @param entityId 值对象主键
	 */
	public void deleteByEntity(String entity, Long entityId){
		if(entity != null && entity.trim().length() > 0 && entityId != null){
			List<SysFileForm> list = this.getByEntityAndEntityId(entity, entityId);
			if(list != null && list.size() > 0){
				for(SysFileForm form: list)
					this.deleteCascade(form);
			}
		}
	}
	
	/**
	 * 根据主键id级联删除附件对象
	 * @param sysFileIds
	 */
	public void deleteCascade(Long... sysFileIds){
		if(sysFileIds != null){
			for(Long sysFileId : sysFileIds){
				
				//删除关联项
				SysFileLink link = sysFileLinkDao.getBySysFileId(sysFileId);
				sysFileLinkDao.delete(link);
				
				//删除附件记录
				this.delete(sysFileId);
			}
		}
	}
	
	/**
	 * 根据SysFileForm对象的主键级联删除附件对象
	 * @param forms
	 */
	public void deleteCascade(SysFileForm... forms){
		if(forms != null){
			for(SysFileForm form : forms)
				deleteCascade(form.getSysFileId());
		}
	}

	/**
	 * 判断是否存在指定文件编号的附件记录
	 * @param fileCode 文件编号
	 * @return
	 */
	@Transactional(readOnly = true)
	public boolean exist(String fileCode){
        boolean exist = true;
        if(StringUtils.isNotBlank(fileCode)){
            List result = sysFileDao.findBy("fileCode", fileCode);
            if(result == null || result.size() == 0)
                exist = false;
        }
        return exist;
    }
	
	/**
	 * 获取附件数量
	 * @param entity
	 * @param entityId
	 * @return
	 */
	@Transactional(readOnly = true)
	public int getSysFileCount(String entity, Long entityId){
		Long[] sysFileIds = sysFileLinkDao.getSysFileIds(entity, entityId);
		return sysFileIds != null ? sysFileIds.length : 0;
	}
	
	@Transactional(readOnly = true)
	public List<SysFileForm> getSortedFilesByBusObj(String entity, Long entityId, String sortClause){
		if(entity != null && entity.trim().length() > 0 && entityId != null
				&& sortClause != null && sortClause.trim().length() > 0){
			
			String hql = "select file from SysFile file, SysFileLink link" +
					" where file.sysFileId=link.sysFileId and link.entity=? and link.entityId=? " + sortClause;
			List<SysFile> enities = sysFileDao.find(hql, entity, entityId);
			return SysFileConverter.convertToFormList(enities);
		}
		return null;
	}
	
	@Transactional(readOnly = true)
	public List<SysFileForm> getSortedFilesByBusObjAndType(String entity, Long entityId, String fileType, String sortClause){
		if(entity != null && entity.trim().length() > 0 && entityId != null
				&& sortClause != null && sortClause.trim().length() > 0){
			
			String hql = "select file from SysFile file, SysFileLink link" +
					" where file.sysFileId=link.sysFileId and link.entity=? and link.entityId=? and file.fileType=? " + sortClause;
			List<SysFile> enities = sysFileDao.find(hql, entity, entityId, fileType);
			return SysFileConverter.convertToFormList(enities);
		}
    	return null;
	}
}
